home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import apt
- import aptdaemon
- import locale
- import dbus
- import dbus.service as dbus
- import gettext
- import locale
- import logging
- import glib
- import gtk
- import os
- import subprocess
- import sys
- import xapian
- from SimpleGtkbuilderApp import SimpleGtkbuilderApp
- from softwarecenter.enums import *
- from softwarecenter.version import *
- from softwarecenter.db.database import StoreDatabase
- import view.dialogs as view
- from view.viewswitcher import ViewSwitcher, ViewSwitcherList
- from view.pendingview import PendingView
- from view.installedpane import InstalledPane
- from view.availablepane import AvailablePane
- from view.softwarepane import SoftwarePane
- from apt.aptcache import AptCache
- from gettext import gettext as _
-
- class SoftwarecenterDbusController(dbus.service.Object):
- '''
- This is a helper to provide the SoftwarecenterIFace
-
- It provides
- '''
-
- def __init__(self, parent, bus_name, object_path = '/com/ubuntu/Softwarecenter'):
- dbus.service.Object.__init__(self, bus_name, object_path)
- self.parent = parent
-
-
- def bringToFront(self):
- self.parent.window_main.present()
- return True
-
- bringToFront = dbus.service.method('com.ubuntu.SoftwarecenterIFace')(bringToFront)
-
-
- class SoftwareCenterApp(SimpleGtkbuilderApp):
- (NOTEBOOK_PAGE_AVAILABLE, NOTEBOOK_PAGE_INSTALLED, NOTEBOOK_PAGE_PENDING) = range(3)
- WEBLINK_URL = 'http://apt.ubuntu.com/p/%s'
-
- def __init__(self, datadir, xapian_base_path):
- SimpleGtkbuilderApp.__init__(self, datadir + '/ui/SoftwareCenter.ui', 'software-center')
- gettext.bindtextdomain('software-center', '/usr/share/locale')
- gettext.textdomain('software-center')
-
- try:
- locale.setlocale(locale.LC_ALL, '')
- except:
- logging.exception('setlocale failed')
-
- self.setup_dbus_or_bring_other_instance_to_front()
- self.setup_database_rebuilding_listener()
-
- try:
- locale.setlocale(locale.LC_ALL, '')
- except Exception:
- e = None
- logging.exception('setlocale failed')
-
- pathname = os.path.join(xapian_base_path, 'xapian')
-
- try:
- self.db = StoreDatabase(pathname)
- self.db.open()
- except xapian.DatabaseOpeningError:
- if os.path.isdir(pathname) and not os.listdir(pathname):
- rebuild_database = rebuild_database
- import softwarecenter.db.update
- logging.info('building local database')
- rebuild_database(pathname)
- self.db = StoreDatabase(pathname)
- self.db.open()
-
- except xapian.DatabaseCorruptError:
- e = None
- logging.exception('xapian open failed')
- view.dialogs.error(None, _('Sorry, can not open the software database'), _("Please re-install the 'software-center' package."))
- sys.exit(1)
-
- self.icons = gtk.icon_theme_get_default()
- self.icons.append_search_path(ICON_PATH)
- self.icons.append_search_path(SOFTWARE_CENTER_ICON_PATH)
- self.icons.append_search_path(datadir + '/icons/32x32/status')
- self.cache = AptCache()
- self._pending_transactions = 0
- self._block_menuitem_view = False
- self._available_items_for_page = { }
- self._selected_pkgname_for_page = { }
- self._selected_appname_for_page = { }
- self.available_pane = AvailablePane(self.cache, self.db, self.icons, datadir)
- self.available_pane.app_details.connect('selected', self.on_app_details_changed, self.NOTEBOOK_PAGE_AVAILABLE)
- self.available_pane.app_view.connect('application-selected', self.on_app_selected, self.NOTEBOOK_PAGE_AVAILABLE)
- self.available_pane.connect('app-list-changed', self.on_app_list_changed, self.NOTEBOOK_PAGE_AVAILABLE)
- self.alignment_available.add(self.available_pane)
- self.installed_pane = InstalledPane(self.cache, self.db, self.icons, datadir)
- self.installed_pane.app_details.connect('selected', self.on_app_details_changed, self.NOTEBOOK_PAGE_INSTALLED)
- self.installed_pane.app_view.connect('application-selected', self.on_app_selected, self.NOTEBOOK_PAGE_INSTALLED)
- self.installed_pane.connect('app-list-changed', self.on_app_list_changed, self.NOTEBOOK_PAGE_INSTALLED)
- self.alignment_installed.add(self.installed_pane)
- self.pending_view = PendingView(self.icons)
- self.scrolledwindow_transactions.add(self.pending_view)
- self.view_switcher = ViewSwitcher(datadir, self.icons)
- self.scrolledwindow_viewswitcher.add(self.view_switcher)
- self.view_switcher.show()
- self.view_switcher.connect('view-changed', self.on_view_switcher_changed)
- self.view_switcher.model.connect('transactions-changed', self.on_view_switcher_transactions_changed)
- self.view_switcher.set_view(ViewSwitcherList.ACTION_ITEM_AVAILABLE)
-
- try:
- import LaunchpadIntegration
- LaunchpadIntegration.set_sourcepackagename('software-center')
- LaunchpadIntegration.add_items(self.menu_help, 1, True, False)
- except Exception:
- e = None
- logging.debug("launchpad integration error: '%s'" % e)
-
- self.available_pane.searchentry.grab_focus()
-
-
- def on_app_details_changed(self, widget, appname, pkgname, page):
- self._selected_pkgname_for_page[page] = pkgname
- self._selected_appname_for_page[page] = appname
- self.update_app_status_menu()
- self.update_status_bar()
-
-
- def on_app_list_changed(self, pane, new_len, page):
- self._available_items_for_page[page] = new_len
- if self.notebook_view.get_current_page() == page:
- self.update_status_bar()
-
-
-
- def on_app_selected(self, widget, appname, pkgname, page):
- self._selected_appname_for_page[page] = appname
- self._selected_pkgname_for_page[page] = pkgname
- self.menuitem_copy.set_sensitive(True)
- self.menuitem_copy_web_link.set_sensitive(True)
-
-
- def on_window_main_delete_event(self, widget, event):
- gtk.main_quit()
-
-
- def on_view_switcher_transactions_changed(self, view_switcher, pending_nr):
- if pending_nr == 0 and self._view_before_pending_switch is not None:
- if self.view_switcher.get_view() is None:
- self.view_switcher.set_view(self._view_before_pending_switch)
-
- self._view_before_pending_switch = None
- elif pending_nr > 0 and self._pending_transactions == 0:
- self._view_before_pending_switch = self.view_switcher.get_view()
- self.view_switcher.set_view(ViewSwitcherList.ACTION_ITEM_PENDING)
-
- self._pending_transactions = pending_nr
-
-
- def on_view_switcher_changed(self, view_switcher, action):
- logging.debug('view_switcher_activated: %s %s' % (view_switcher, action))
- if action == self.NOTEBOOK_PAGE_AVAILABLE:
- self.active_pane = self.available_pane
- elif action == self.NOTEBOOK_PAGE_INSTALLED:
- self.active_pane = self.installed_pane
- elif action == self.NOTEBOOK_PAGE_PENDING:
- self.active_pane = None
- elif not False:
- raise AssertionError, 'Not reached'
- self.menuitem_view_supported_only.set_sensitive(self.active_pane != None)
- self.menuitem_view_all.set_sensitive(self.active_pane != None)
- if self.active_pane:
- self._block_menuitem_view = True
- if self.active_pane.apps_filter.get_supported_only():
- self.menuitem_view_supported_only.activate()
- else:
- self.menuitem_view_all.activate()
- self._block_menuitem_view = False
-
- self.notebook_view.set_current_page(action)
- self.update_status_bar()
- self.update_app_status_menu()
-
-
- def on_menuitem_install_activate(self, menuitem):
- self.active_pane.app_details.install()
-
-
- def on_menuitem_remove_activate(self, menuitem):
- self.active_pane.app_details.remove()
-
-
- def on_menuitem_close_activate(self, widget):
- gtk.main_quit()
-
-
- def on_menu_edit_activate(self, menuitem):
- '''
- Check whether the search field is focused and if so, focus some items
- '''
- if self.active_pane:
- state = self.active_pane.searchentry.is_focus()
- else:
- state = False
- edit_menu_items = [
- self.menuitem_undo,
- self.menuitem_redo,
- self.menuitem_cut,
- self.menuitem_copy,
- self.menuitem_paste,
- self.menuitem_delete,
- self.menuitem_select_all]
- for item in edit_menu_items:
- item.set_sensitive(state)
-
-
-
- def on_menuitem_undo_activate(self, menuitem):
- self.active_pane.searchentry.undo()
-
-
- def on_menuitem_redo_activate(self, menuitem):
- self.active_pane.searchentry.redo()
-
-
- def on_menuitem_cut_activate(self, menuitem):
- self.active_pane.searchentry.cut_clipboard()
-
-
- def on_menuitem_copy_activate(self, menuitem):
- self.active_pane.searchentry.copy_clipboard()
-
-
- def on_menuitem_paste_activate(self, menuitem):
- self.active_pane.searchentry.paste_clipboard()
-
-
- def on_menuitem_delete_activate(self, menuitem):
- self.active_pane.searchentry.set_text('')
-
-
- def on_menuitem_select_all_activate(self, menuitem):
- self.active_pane.searchentry.select_region(0, -1)
-
-
- def on_menuitem_copy_web_link_activate(self, menuitem):
- page = self.notebook_view.get_current_page()
-
- try:
- pkg = self._selected_pkgname_for_page[page]
- except KeyError:
- e = None
- return None
-
- clipboard = gtk.Clipboard()
- clipboard.set_text(self.WEBLINK_URL % pkg)
-
-
- def on_menuitem_search_activate(self, widget):
- if self.active_pane:
- self.active_pane.searchentry.grab_focus()
- self.active_pane.searchentry.select_region(0, -1)
-
-
-
- def on_menuitem_software_sources_activate(self, widget):
- self.window_main.set_sensitive(False)
- p = subprocess.Popen([
- 'gksu',
- '--desktop',
- '/usr/share/applications/software-properties.desktop',
- '--',
- '/usr/bin/software-properties-gtk',
- '-n',
- '-t',
- str(self.window_main.window.xid)])
- ret = None
- while ret is None:
- while gtk.events_pending():
- gtk.main_iteration()
- ret = p.poll()
- if ret == 1:
- self.run_update_cache()
-
- self.window_main.set_sensitive(True)
-
-
- def on_menuitem_about_activate(self, widget):
- self.aboutdialog.set_version(VERSION)
- self.aboutdialog.run()
- self.aboutdialog.hide()
-
-
- def on_menuitem_help_activate(self, menuitem):
- p = subprocess.Popen([
- 'yelp',
- 'ghelp:software-center'])
- glib.timeout_add(1000, (lambda p: p.poll() == None), p)
-
-
- def on_menuitem_view_all_activate(self, widget):
- if self._block_menuitem_view:
- return None
- self.active_pane.apps_filter.set_supported_only(False)
- self.active_pane.refresh_apps()
-
-
- def on_menuitem_view_supported_only_activate(self, widget):
- if self._block_menuitem_view:
- return None
- self.active_pane.apps_filter.set_supported_only(True)
- self.active_pane.refresh_apps()
-
-
- def _on_trans_finished(self, trans, enum):
- '''callback when a aptdaemon transaction finished'''
- if enum == aptdaemon.enums.EXIT_FAILED:
- excep = trans.get_error()
- msg = '%s: %s\n%s\n\n%s' % (_('ERROR'), aptdaemon.enums.get_error_string_from_enum(excep.code), aptdaemon.enums.get_error_description_from_enum(excep.code), excep.details)
- print msg
-
- self.cache.open()
-
-
- def run_update_cache(self):
- '''update the apt cache (e.g. after new sources where added '''
- aptd_client = aptdaemon.client.AptClient()
- trans = aptd_client.update_cache(exit_handler = self._on_trans_finished)
-
- try:
- trans.run()
- except dbus.exceptions.DBusException:
- e = None
- if e._dbus_error_name == 'org.freedesktop.PolicyKit.Error.NotAuthorized':
- pass
- else:
- raise
- e._dbus_error_name == 'org.freedesktop.PolicyKit.Error.NotAuthorized'
-
-
-
- def update_app_status_menu(self):
- """Helper that updates the 'File' and 'Edit' menu to enable/disable
- install/remove and Copy/Copy weblink
- """
- logging.debug('update_app_status_menu')
- page = self.notebook_view.get_current_page()
-
- try:
- pkgname = self._selected_pkgname_for_page[page]
- except KeyError:
- e = None
- self.menuitem_install.set_sensitive(False)
- self.menuitem_remove.set_sensitive(False)
- self.menuitem_copy_web_link.set_sensitive(False)
- return False
-
- if not self.cache.ready:
- glib.timeout_add((100,), (lambda : self.update_app_status_menu()))
- return False
- if not self.cache.has_key(pkgname):
- self.menuitem_install.set_sensitive(False)
- self.menuitem_remove.set_sensitive(False)
- self.menuitem_copy_web_link.set_sensitive(False)
-
- if self.cache.has_key(pkgname):
- pkg = self.cache[pkgname]
- installed = bool(pkg.installed)
- self.menuitem_install.set_sensitive(not installed)
- self.menuitem_remove.set_sensitive(installed)
- else:
- self.menuitem_install.set_sensitive(False)
- self.menuitem_remove.set_sensitive(False)
- return False
-
-
- def update_status_bar(self):
- '''Helper that updates the status bar'''
- page = self.notebook_view.get_current_page()
- if self.active_pane:
- s = self.active_pane.get_status_text()
- else:
- s = ''
- self.label_status.set_text(s)
-
-
- def _on_database_rebuilding_handler(self, is_rebuilding):
- logging.debug('_on_database_rebuilding_handler %s' % is_rebuilding)
- self._database_is_rebuilding = is_rebuilding
- self.window_rebuilding.set_transient_for(self.window_main)
- self.window_rebuilding.set_title('')
- self.window_main.set_sensitive(not is_rebuilding)
- if is_rebuilding:
- self.window_rebuilding.show()
- else:
- self.db.reopen()
- self.window_rebuilding.hide()
-
-
- def setup_database_rebuilding_listener(self):
- '''
- Setup system bus listener for database rebuilding
- '''
- self._database_is_rebuilding = False
-
- try:
- bus = dbus.SystemBus()
- except:
- logging.exception('could not get system bus')
- return None
-
-
- try:
- proxy_obj = bus.get_object('com.ubuntu.Softwarecenter', '/com/ubuntu/Softwarecenter')
- iface = dbus.Interface(proxy_obj, 'com.ubuntu.Softwarecenter')
- res = iface.IsRebuilding()
- self._on_database_rebuilding_handler(res)
- except Exception:
- e = None
- logging.debug("query for the update-database exception '%s' (probably ok)" % e)
-
- bus.add_signal_receiver(self._on_database_rebuilding_handler, 'DatabaseRebuilding', 'com.ubuntu.Softwarecenter')
-
-
- def setup_dbus_or_bring_other_instance_to_front(self):
- '''
- This sets up a dbus listener
- '''
-
- try:
- bus = dbus.SessionBus()
- except:
- logging.exception('could not initiate dbus')
- return None
-
-
- try:
- proxy_obj = bus.get_object('com.ubuntu.Softwarecenter', '/com/ubuntu/Softwarecenter')
- iface = dbus.Interface(proxy_obj, 'com.ubuntu.SoftwarecenterIFace')
- iface.bringToFront()
- sys.exit()
- except dbus.DBusException:
- e = None
- bus_name = dbus.service.BusName('com.ubuntu.Softwarecenter', bus)
- self.dbusControler = SoftwarecenterDbusController(self, bus_name)
-
-
-
- def run(self):
- self.window_main.show_all()
- SimpleGtkbuilderApp.run(self)
-
-
-